/**
在 TypeScript 中，别名（Type Alias）和接口（Interface）都是用于定义类型的工具，但它们在使用方式和功能上有一些区别。
  1. 基本概念
  - 别名（Type Alias）：使用  `type`  关键字定义的类型别名，可以为任何类型（包括基本类型、联合类型、元组等）创建一个新的名称。
  - 接口（Interface）：使用  `interface`  关键字定义的类型，主要用于描述对象的结构和类型。

  2. 语法
   别名示例：
  type StringOrNumber = string | number;

  const value: StringOrNumber = "Hello"; // 合法
  const anotherValue: StringOrNumber = 42; // 也合法
   接口示例：
  interface User {
    name: string;
    age: number;
  }

  const user: User = {
    name: "Alice",
    age: 30,
  };
  3. 功能和特点

   1. 扩展性

  - 接口：可以通过继承扩展其他接口，支持多重继承。
  interface Person {
    name: string;
  }

  interface Employee extends Person {
    employeeId: number;
  }
  - 别名：不支持扩展，但可以使用交叉类型（Intersection Types）来组合多个类型。
  type Person = {
    name: string;
  };

  type Employee = Person & {
    employeeId: number;
  };
   2. 描述类型

  - 接口：主要用于描述对象的结构，适合用于定义类的形状、函数的参数和返回值等。

  - 别名：可以用于定义任何类型，包括基本类型、联合类型、元组等，使用更灵活。
  type StringOrNumber = string | number; // 联合类型
  type Point = [number, number]; // 元组类型
  4. 重名问题

  - 接口：可以重复声明同名接口，TypeScript 会自动合并它们。
  interface User {
    name: string;
  }

  interface User {
    age: number;
  }

  // 合并后的 User 接口
  // interface User {
  //   name: string;
  //   age: number;
  // }
  - 别名：不支持同名重定义，重复声明会导致错误。
  type User = {
    name: string;
  };

  // 下面的声明会报错
  // type User = {
  //   age: number;
  // };
  5. 总结
  - 接口 更适合用于描述对象的结构，支持继承和合并，适用于面向对象编程。
  - 别名 更灵活，可以定义任何类型，适用于需要组合多个类型的场景。

  在选择使用接口还是别名时，开发者可以根据具体的需求和场景来决定。对于对象结构的定义，接口通常是更好的选择；而对于复杂类型的组合，别名则更为合适。
 */
// 1.区别一: type类型使用范围更广, 接口类型只能用来声明对象
type MyNumber = number
type IDType = string | number

// 2.区别二: 在声明对象时, interface可以多次声明
// 2.1 type不允许两个相同名称的别名同时存在
// type PointType1 = {
//   x: number
//   y: number
// }
// type PointType1 = {
//   z?: number
// }
// 2.2. interface可以多次声明同一个接口名称
interface PointType {
  x: number
  y: number
}
interface PointType {
  z: number
}
const point: PointType = {
  x: 100,
  y: 200,
  z: 300
}

// 3.interface支持继承的
interface IPerson {
  name: string;
  age: number;
}

interface IStudent extends IPerson {
  sno: number;
}

const student: IStudent = {
  name: 'interface-name',
  age: 18,
  sno: 111
}

// 4.interface可以被类实现(TS面向对象时候再讲)
// 5.type可以声明联合类型/元组类型别名
type PointType2 = [number, number]

// 总结: 如果是非对象类型的定义使用type, 如果是对象类型的声明那么使用interface
export {}
